package com.linxuan.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 添加一个全局异常处理器
 */
// @RestControllerAdvice标识该类为REST风格对应的异常处理器，包含了@RestController=@Response+@Controller
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 遇到我们自定义业务异常CustomException异常的时候会执行该方法
     * @param ex CustomException异常
     * @return  返回前端异常信息
     */
    @ExceptionHandler(CustomException.class)
    public R<String> exceptionHandler(CustomException ex) {
        log.error(ex.getMessage());

        return R.error(ex.getMessage());
    }

    /**
     * 当遇到SQLIntegrityConstraintViolationException的时候执行该方法
     * SQLIntegrityConstraintViolationException：SQL完整性约束违反异常
     * 违反了数据库的唯一约束条件，插入数据时。具有唯一约束条件的字段值重复。
     *
     * @param ex 异常对象
     * @return R<String>
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) {
        // 打印异常信息：Duplicate entry 'reggie001' for key 'employee.idx_username'
        log.error(ex.getMessage());

        if (ex.getMessage().contains("Duplicate entry")) {
            // 获取由空格切割异常信息的数组
            String[] strs = ex.getMessage().split(" ");
            // 字符串拼接 重复用户名 + 已存在
            String msg = strs[2] + "已存在";
            // 以JSON格式响应给前端，前端会进行处理
            return R.error(msg);
        }

        return R.error("未知错误");
    }
}
